#ifndef ARCHIVO_H_
#define ARCHIVO_H_

#include "Almacenamiento.h"
#include <string>
#include <fstream>

namespace Toolkit
{

class Archivo: public Almacenamiento
{

public:
	/**
	 * Construir un nuevo archivo.
	 * */
	Archivo (const unsigned long int &tamanoUnidad, const string& ruta, const string& nombre,
		const TipoSerializacion& tserializacion, const stringstream &metadata);
	
	/**
	 * Recuperar un archivo usado antes.
	 * */
	Archivo (const string& ruta, const string& nombre,
		const TipoSerializacion& tserializacion);
	
	/**
	 * Carga en el stream especificado la metadata presente en el encabezado del archivo.
	 * */
	virtual void leerMetaData(stringstream &metadata);	
	
	/**
	 * Reemplaza la metadata presente en el archivo, con aquella pasada por parámetro.
	 * Se asume que tiene el mismo tamaño que la anterior.
	 * */
	virtual void actualizarMetadata(stringstream &metadata);
	
	virtual ~Archivo();
	
	virtual unsigned long int guardarDato (const stringstream &serializacion);
	virtual void eliminarDato (const long unsigned int posicionDondeEliminar, stringstream &resultado);
	virtual void recuperarDato (const unsigned long int posicionDondeGuardar, stringstream &resultado) const;

private:
	string ruta, nombre;
	list<unsigned long int> espacios;
	unsigned long int tamanoMetadata;
	
	static const int CARCACTERES_TAMANO = 8;
	
	/**
	 * Crea el archivo con el nombre pasado, y lo deja abierto para lectura escritura. 
	 * */
	void crearArchivo(const char* filename, fstream *archivo, 
				const TipoSerializacion &tserializacion = BINARIO);
	
};

}
#endif /* ARCHIVO_H_ */
